<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>
<script>
// 函数声明、函数调用


/* 函数声明
  - 声明的两种形式：
    - 声明式
      function 函数/变量名(形参1, 形参2, ...) {

      }
      注：声明式函数，有「预解析」的功能；
        什么是预解析：即在「函数声明」之前，就可以进行「函数调用」
          原理：代码执行之前，会先进行 函数声明的解析，即将函数的代码体先放到内存中。


    - 赋值式，即类似 变量声明的形式
      var 函数名/变量名 = function(形参1, 形参2, ...) {

      }
      注：因为 var 变量有「变量提升」的功能；
        所以，赋值式声明函数，只有变量提升的效果，则没有了「预解析」的功能。
      


  - 参数：实参
    - add(1+1, 2) // 执行函数，小括号里面的 表达式返回值，其被称为「实参」。

  - 参数：形参：
    function add(x1, y) { return x1 + y };
    // 声明函数时，小括号里面的「变量」，在函数执行 的时候，
        通过对应位置的 实参，给形参赋值。


  - 关键字： arguments、return
      - arguments：
        作用：统一放置  所有实参。
      - return:
        作用：
          1. 若 return 其后有表达式结果值，即执行函数，返回 return 后面的值。
          2. 函数体代码的执行，只要遇到 return ，则其后面的代码都不会被继续执行
*/



// ---------------  代码演示 ----------------------

/* return
  function f() {
    return 7 + 7;
  }

  f()  其返回值为 14
*/

function f() {
  console.log(1)
  return 7 + 7;
  console.log(2); // 这行代码 ，不会被执行
}



/* arguments 演示

  function say() { // say 实参
    console.log(arguments);
  }
  say(1, 2, 3, 'a', 'b', 'c')
    ->  
      [
        0: 1,
        1: 2,
        2: 3,
        3: "a",
        4: "b",
        5: "c",
        length: 6
      ];
  arguments.length -> 6
  arguments[4]     -> "b"
  arguments[0]     -> 1
*/



/* 赋值式函数，无 预解析，只有 变量提升

  console.log(f); // undefined
  f(); // 无法先执行 函数了，因为没有 预解析
  var f = function() { // 赋值式，声明函数
    console.log('fff - fff');
  }

*/


/* 预解析  、  变量提升， 演示

  f(); 

  // console.log(num); // 变量提升，num值为 undefined

  var num = 123;


  function f() {
    console.log('666');
  }

*/

</script>